package com.apuntesdejava.demoswingdbapp;

import com.apuntesdejava.demoswingdbapp.bean.Product;
import com.apuntesdejava.demoswingdbapp.bean.ProductCode;
import com.apuntesdejava.demoswingdbapp.dao.ProductCodeDao;
import com.apuntesdejava.demoswingdbapp.dao.ProductDao;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.AbstractListModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.table.AbstractTableModel;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 *
 * @author dsilva
 */
public class MainApp extends JFrame {

    private JComboBox<ProductCode> productCodeCB;
    private JTable productJT = new JTable();
    private JScrollPane productSP = new JScrollPane();
    private ProductCodeDao productCodeDao;
    private ProductDao productDao;
    private ProductCode productCodeSelected;
    private List<Product> productList;

    public static void main(String[] args) {
        MainApp app = new MainApp();
        app.init();
        app.run();
    }

    private void init() {
        springStart();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        BorderLayout layout = new BorderLayout();
        getContentPane().setLayout(layout);
        List<ProductCode> codesItems = productCodeDao.findAll(); //obtenemos toda la lista de codigos
        codesItems.add(0, new ProductCode("", "Seleccione"));
        ProductCode[] aCodeItems = codesItems.toArray(new ProductCode[0]); //lo convertimos en arreglo

        productCodeCB = new JComboBox<>(aCodeItems); // y lo colocamos en el combo de codigos
        productCodeCB.addActionListener(new ActionListener() { //accion que se ejecuta cuando hace algo el combo
            @Override
            public void actionPerformed(ActionEvent e) {
                productCodeCBActionListener(e);
            }
        });
        productJT.setModel(new AbstractTableModel() { //el modelo de cómo se manejara la lista de productos
            @Override
            public int getRowCount() {
                if (productList == null) {
                    return 0;
                }
                return productList.size();
            }

            @Override
            public int getColumnCount() {
                return 3; //tres campos
            }

            @Override
            public Object getValueAt(int rowIndex, int columnIndex) {
                if (productList == null) {
                    return null;
                }
                switch (columnIndex) {
                    case 0:
                        return productList.get(rowIndex).getProductId();
                    case 1:
                        return productList.get(rowIndex).getProductCode();
                    case 2:
                        return productList.get(rowIndex).getDescription();
                }
                return null;
            }

            @Override
            public String getColumnName(int column) {
                switch (column) {
                    case 0:
                        return "ID";
                    case 1:
                        return "Tipo";
                    case 2:
                        return "Código";
                }
                return null;
            }

            @Override
            public Class<?> getColumnClass(int columnIndex) {
                switch (columnIndex) {
                    case 0:
                        return Integer.class;
                    case 1:
                        return String.class;
                    case 2:
                        return String.class;
                }
                return null;
            }
        });
        productSP.setViewportView(productJT);

        getContentPane().add(productCodeCB, BorderLayout.NORTH);
        getContentPane().add(productSP, BorderLayout.CENTER);

        pack();
    }

    private void productCodeCBActionListener(ActionEvent e) {
        productCodeSelected = (ProductCode) productCodeCB.getSelectedItem(); //obtenemos el elemento seleccionado
        if (productCodeSelected != null && productCodeSelected.getProdCode() != null && !productCodeSelected.getProdCode().isEmpty()) { //si se selecciono un elemento...
            productList = productDao.findProductByProductCode(productCodeSelected.getProdCode()); //buscar en la base de datos
            ((AbstractTableModel) productJT.getModel()).fireTableDataChanged(); //refrescamos el contenido de la tabla
        }

    }

    private void run() {
        this.setVisible(true);
    }

    /**
     * Inicializador de Spring para la aplicacion
     */
    private void springStart() {
        ApplicationContext context =
                new ClassPathXmlApplicationContext(new String[]{"/resources/beans.xml"}); //ruta relativa al classpath del recurso con las definiciones de spring
        productDao = (ProductDao) context.getBean("productDao"); //obtengo los beans, ya están instanciados
        productCodeDao = (ProductCodeDao) context.getBean("productCodeDao");
    }
}
